package IAPractica1;
import java.util.ArrayList;
/*
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;*/
import java.util.Vector;

import IA.Gasolina.Gasolineras;


public class StateCentre {	
	
	// Variables de Classe
	private static final int kmMax = 640;
	private static final int viajesMax = 5;
	
	// Kilometros actuales recorridos
	private int RecorregutActual;
	
	// Entregas realizadas (1 o 2 viajes por entrega)
	private Vector<Delivery> entregas;	
	
	
	StateCentre(int x, int y){//, ArrayList<Integer> gasAsociada, Gasolineras gasolineras){		
		RecorregutActual = 0;		
		entregas = new Vector<Delivery>();
		for(int i = 0; i< viajesMax; ++i)
			entregas.add(new Delivery(x,y));//,gasAsociada,gasolineras));
		
	}
	
	StateCentre(int RecorregutActual,Vector<Delivery> entregas){
		this.RecorregutActual = RecorregutActual;
		this.entregas = entregas;
	}
	
	public int getNumEntregas(){
		int numEnt = 0;
		for (int i = 0; i < entregas.size(); i++)
			if (entregas.get(i).getDistance() > 0)
				numEnt++;
		return numEnt;
	}
	
	public int getKm(){
		return RecorregutActual;
	}	
		
	public Vector<Delivery> getViajes(){
		return entregas;
	}
	
	public boolean checkBelowMaxKm(){
		return RecorregutActual <= kmMax;
	}
	

	public void deleteParada(int idEntrega,int idPeticio){
		Delivery entrega = entregas.get(idEntrega);
		entrega.elimParada(idPeticio);
	}
	
	public boolean addParada(int idEntrega,int idPeticio){
		Delivery entrega = entregas.get(idEntrega);
		if(entrega.full())return false;
		
		int d = entrega.getDistance();
		
		entrega.afegirParada(idPeticio);
		d = entrega.getDistance() - d;
		
		if(RecorregutActual+d > kmMax) {
			entrega.elimParada(idPeticio);
			return false;
		}		
		
		RecorregutActual += d;
		return checkBelowMaxKm();
	}
	
	public boolean subsParada(int idEntrega, int idPeticio, int idPeticio2){
		if(! entregas.get(idEntrega).present(idPeticio)) return false;
		int dist =entregas.get(idEntrega).getDistance();
		entregas.get(idEntrega).subsParada(idPeticio, idPeticio2);
		dist = entregas.get(idEntrega).getDistance() - dist;
		RecorregutActual += dist;
		return checkBelowMaxKm();
	}
	
	public void getidEntregues(ArrayList<Integer> list){
		for(int i = 0; i<viajesMax; ++i)
			entregas.get(i).getidEntregues(list);
	}
	
	public void validarPeticions(ArrayList<Integer> list, int idCentre){
		for(int i = 0; i<viajesMax; ++i)
			entregas.get(i).validarPeticions(list,idCentre);
	}
	
	public void  afegirEntreguesNotFull(ArrayList<Pair> list,int idCentre) {
		for(int i = 0; i<viajesMax; ++i)
			if(! entregas.get(i).full()) list.add(new Pair(idCentre, i));
	}
	
	public StateCentre copy(){
		Vector<Delivery> entregasCopy = new Vector<Delivery>();
		for(int i = 0; i<viajesMax; ++i)
			entregasCopy.add(entregas.get(i).copy());
		return new StateCentre (RecorregutActual,entregasCopy);
	}
}

